唯心又看了詩憶之前寫的幾個高階函式練習。「嗯⋯⋯我覺得妳與其說是對高階函式不熟,不如說是對匿名函式不熟唷。就算不指定string: String ->
,在函式只有一個參數的情形下,可以直接用it
;但是多個參數就要一一指名道姓囉。」
fun main() {
meowPrint(printer = { println(it) })
}
fun meowPrint(string: String = "Hello World", printer: (String)-> Unit) {
printer(string)
printer("meow~")
}
她繼續說:「而且,當函式參數排在參數尾端的情形下,函式可以拉出括號之外。如果其他參數都打算使用預設值,那就連括號都可以直接拿掉。」
fun main() {
meowPrint("Haha") { println(it) }
meowPrint{ println(it) }
}
「如果參數就只有一個,且那個參數就是函式參數也符合這個條件嗎?」詩憶提出一個比較極端的例子。
唯心笑了笑:「那和第二個例子一樣,因為沒有傳入其他參數,括號可以整個拿掉。」她想了想,決定趁此讓詩憶學會各種寫法。「還有啊,函式除了當作參數傳入以外,也能當作回傳值唷。比如我們把各種會帶語助詞的話獨立成一個函式,然後再把函式回傳存成變數來呼叫。」
fun main() {
val 喵君說 = 說("喵")
val 汪君說 = 說("汪")
喵君說("早安")
喵君說("午安")
汪君說("晚安")
}
fun 說(語尾詞: String) : (String)-> Unit {
return { println("${it} ${語尾詞}~") }
}
早安 喵~
午安 喵~
晚安 汪~
「如果寫成表達式的話,還可以省去宣告回傳的型別。」唯心補充說。
fun 說(語尾詞: String) = {
it: String ->
println("${it} ${語尾詞}~")
}